package com.outstanding.ifml;

import java.io.InputStream;
import java.util.ServiceLoader;

import com.outstanding.ifml.exception.IFMLException;

import com.outstanding.ifml.parser.DefaultIFMLLexer;
import com.outstanding.ifml.parser.DefaultParser;
import com.outstanding.ifml.parser.IFMLLexer;

public class ParserFactory {
	
	
	
	/**
	 * 
	 * @param input 文件流
	 * @param IFMLPaserProperties 解析配置属性
	 * @return 解析器
	 */
	public static Parser creatParser(InputStream input,IFMLPaserProperties properties){
		Parser parser = null;
		ServiceLoader<Parser> parserLoader = ServiceLoader.load(Parser.class);
		for (Parser spi : parserLoader) {
            if (properties.getParserClass().equals(spi.getClass().getName())) {
            	parser = spi;
            	break;
            }
        }
		IFMLLexer lexer = null;
		ServiceLoader<IFMLLexer> lexerLoader = ServiceLoader.load(IFMLLexer.class);
		for (IFMLLexer spi : lexerLoader) {
            if (properties.getLexerClass().equals(spi.getClass().getName())) {
            	lexer = spi;
            }
        }
		if(parser == null || lexer ==null){
			throw new IFMLException(Code.P1012,"无法加载解析类");
		}
		lexer.init(input, properties);
		parser.init(lexer);
		return parser;
		
		
	}
	
	
	
	
//	// 读取配置获取所有实现
//    private static ServiceLoader<Parser> parserLoader = ServiceLoader.load(Parser.class);
//    // 读取配置获取所有实现
//    private static ServiceLoader<IFMLLexer> lexerLoader = ServiceLoader.load(IFMLLexer.class);
//    
//    
//    
//    // 根据名字选取对应实现
//    public static Parser getParser(String name) {
//        for (Parser spi : parserLoader) {
//            if (name.equals(spi.getClass().getName())) {
//                return spi;
//            }
//        }
//        throw new IFMLException(Code.P1012,"无法加载解析类");
//
//    }
//    
//    
//    // 根据名字选取对应实现
//    public static IFMLLexer getLexer(String name) {
//        for (IFMLLexer spi : lexerLoader) {
//            if (name.equals(spi.getClass().getName())) {
//                return spi;
//            }
//        }
//        throw new IFMLException(Code.P1013,"无法加载词法分析类");
//
//    }

}
